package com.powernode.service.impl;

import com.powernode.constant.Constants;
import com.powernode.service.DelayMessageService;
import jakarta.annotation.Resource;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

/**
 * 延迟消息服务实现类
 * 实现了DelayMessageService接口，负责在订单创建后发送延迟消息到RabbitMQ
 * 用于处理订单超时未支付的场景，通过设置消息延迟时间实现定时检查订单状态
 */
@Component
public class DelayMessageServiceImpl implements DelayMessageService {
    @Resource
    private RabbitTemplate rabbitTemplate; // 注入RabbitMQ模板，用于发送消息到RabbitMQ

    /**
     * 下单成功后发送延迟消息
     * 当用户成功创建订单后，调用此方法发送包含订单ID的延迟消息
     * 消息将在指定延迟时间后被消费者接收，用于检查订单是否已支付
     *
     * @param orderId 订单主键ID，用于后续查询订单状态
     */
    @Override
    public void sendMessage(Integer orderId) {
        // 创建消息属性对象，用于设置消息的附加属性
        MessageProperties messageProperties = new MessageProperties();
        // 设置消息头信息，指定消息的延迟时间（从常量类获取）
        // x-delay是RabbitMQ延迟交换机的专用头信息，单位为毫秒
        messageProperties.setHeader("x-delay", Constants.DELAY_TIME);

        // 构建消息对象，将订单ID转换为字节数组作为消息体，并关联消息属性
        Message message = new Message(orderId.toString().getBytes(), messageProperties);

        // 发送消息到指定的延迟交换机和路由键
        // 参数说明：交换机名称、路由键名称、消息对象
        rabbitTemplate.convertAndSend(
                Constants.EXCHANGE_DELAY_NAME,  // 延迟交换机名称（从常量类获取）
                Constants.ROUTING_KEY_DELAY_NAME,  // 延迟路由键名称（从常量类获取）
                message  // 构建好的消息对象
        );
    }
}
